#ifndef __W25Q16_H__
#define __W25Q16_H__

#include "gpio.h"
#include "stdint.h"
#include "spi.h"

//分页写入宏
#define SPI_FLASH_PageSize        256    // 1 Page = 256 Bytes
#define SPI_FLASH_SectorSize      4096   // 1 Sector = 4 KB
// #define SPI_FLASH_BlockSize       65536  // 1 Block = 64 KB
// #define SPI_FLASH_ChipSize        0x1000000 // 16MB = 16,777,216 Bytes

// W25Q16 指令集
#define W25Q16_WRITE_ENABLE     0x06
#define W25Q16_WRITE_DISABLE    0x04
#define W25Q16_READ_STATUS_REG1 0x05
#define W25Q16_PAGE_PROGRAM     0x02
#define W25Q16_SECTOR_ERASE     0x20
#define W25Q16_CHIP_ERASE       0xC7
#define W25Q16_READ_DATA        0x03
#define W25Q16_JEDEC_ID         0x9F

// W25Q16 容量定义
#define W25Q16_PAGE_SIZE        256
#define W25Q16_SECTOR_SIZE      4096
#define W25Q16_BLOCK_SIZE       65536
#define W25Q16_TOTAL_SIZE       2097152 // 2MB

// 函数声明
void W25Q16_Init(SPI_HandleTypeDef *hspi);
uint32_t W25Q16_ReadID(void);
void W25Q16_ReadData(uint32_t addr, uint8_t *data, uint32_t len);
void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
void W25Q16_WritePage(uint32_t addr, uint8_t *data, uint16_t len);
void W25Q16_EraseSector(uint32_t addr);
void W25Q16_EraseChip(void);
uint8_t W25Q16_IsBusy(void);

#endif // __W25Q16_H__
